/*
* 封装axios
* 设置请求拦截器(统一给请求加token)
* 设置响应拦截器(处理错误请求)
* 设置通用的请求方法
*  */

/* 引入Vue组件 */
import Vue from 'vue'
/* 引入axios组件 */
import axios from 'axios'
/* 引入路由配置 @的意思是src目录 */
import router from '@/router'
/* 引入qs模块 */
import qs from 'qs'

/* 配置默认的请求路径前缀 */
axios.defaults.baseURL = 'http://localhost:8080/maven_war_exploded/'
/* 配置请求超时时间,单位毫秒 */
axios.defaults.timeout = 1000 * 10
/* 配置请求拦截器 */
axios.interceptors.request.use(request => {
  /* 从cookie中获取token */
  const token = Vue.$cookies.get('token')
  /* 判断是否存在token */
  if (token) {
    /* 默认每次请求都自动携带token */
    request.headers.token = token
  }
  return request
}, error => {
  return Promise.error(error)
})

/* 配置响应拦截器
* 原本的开发模式，每次ajax请求都需要自己判断是否成功，但实际上这个判断的条件是一致的。
* 这里配置后，再次使用这个封装后的axios就可以不用判断请求是否成功了。
*  */
axios.interceptors.response.use(response => {
  /* 判断请求是否成功 */
  if (response.status === 200) {
    /* 判断是否登录(401表示未登录) */
    if (response.data.code === 401) {
      /* 未登录则进入登录页(首页) */
      router.replace('/')
    } else {
      /* 判断操作是否成功 */
      if (response.data.code === 200 || response.data.code === 0) {
        return Promise.resolve(response)
      } else {
        window.alert(response.data.msg)
        return Promise.reject(response)
      }
    }
  } else {
    return Promise.reject(response)
  }
}, error => {
  return Promise.reject(error)
})
/* 设置通用的请求方法 */
const http = {
  get (url, params) {
    return new Promise((resolve, reject) => {
      axios.get(url, { params }).then(({ data }) => {
        resolve(data)
      }).catch(error => {
        reject(error)
      })
    })
  },
  post (url, params, isQs = false) {
    return new Promise((resolve, reject) => {
      axios.post(url, isQs ? qs.stringify(params) : params).then(({ data }) => {
        resolve(data)
      }).catch(error => {
        reject(error)
      })
    })
  },
  delete (url, params) {
    return new Promise((resolve, reject) => {
      axios.delete(url, { params }).then(({ data }) => {
        resolve(data)
      }).catch(error => {
        reject(error)
      })
    })
  }
}

Vue.prototype.$axios = axios
Vue.prototype.$http = http
